📖
자바스크립트 고차함수
2022.12.04
자바스크립트 고차함수

알고리즘을 풀고, 우테코 프리코스를 하는 중에 내 코드를 보면 항상 for문만을 사용하여 문제를 해결하고 있었다. 코드 리뷰에서 다양한 고차함수를 적절히 활용하면 좋을 것 같다는 이야기를 듣고 공부하게 되었다.
고차함수(Higher-order Function)?👀
- 함수를 매개변수로 사용하거나 함수를 반환하는 함수
1. forEach()
for문을 대체하는 고차함수- 반복문을 추상화하여 구현된 메소드이며 내부에서 주어진 배열을 순회하면서 연산을 수행한다.
// 기본 문법
arr.forEach((item, index, thisArr) => {});
/*
item : 배열요소값, index : 배열 인덱스, thisArr : 참조한 배열
리턴값 : 없음
*/const numberArray = [1, 2, 3, 4, 5];
let sumNumber = 0;
numberArray.forEach((item) => {
sumNumber += item;
});
console.log(sumNumber); // 152. map()
forEach()같이 순회하면서, 콜백함수에서의 실행결과를 리턴한 값으로 이루어진 배열을 만들어 반환
// 기본 문법
arr.map((currentValue, index, array) => {}, thisArg);
/*
currentValue : 현재 배열 요소 값, index : 배열 인덱스
array : 참소한 배열, thisArg : 콜백함수에서 this로 사용할 값
리턴 값 : 반환 타입은 찾은 요소의 타입, 없으면 undefined
*/// 고차함수를 사용하지 않고 구현
const numberArr = [1, 2, 3, 4, 5];
const numberArr2 = [];
for (let i = 0; i < numberArr.length; i++) {
numberArr2.push(numberArr[i] * 2);
}
console.log(numberArr2); // [2,4,6,8,10]const numberArr = [1, 2, 3, 4, 5];
const numberMapArr = numberArr.map((item) => {
return item % 2 === 0 ? 'even' : 'odd';
});
// 화살표 함수를 사용하면 더 간결한 작성이 가능하다
const birthYear = [1975, 1997, 2002, 1995, 1985];
const ages = birthYear.map((year) => 2022 - year);
console.log(ages);forEach()와map()의 차이 : 두 메서드 모두 배열을 순회하는 것은 동일forEach(): 각 요소를 참조한 연산이 이루어짐map(): 각 요소를 다른 값으로 맵핑하나 새로운 배열이 반환된다.forEach()는for문을 대체하여 사용하고,map()은 연산의 결과로 새로운 배열을 생성하고자할 때 사용된다.
3. find()
- 찾고자 하는 값을 그대로 반환한다.
- 주어진 배열을 순회하면서 콜백 함수 실행의 반환 값이 true에 해당하는 첫 번째 요소를 반환
// 기본 문법
arr.find((element, index, array) => {}, thisArg);
/*
element : 현재 배열 요소 값, index : 배열 인덱스
array : 참조한 배열, thisArg : 콜백함수에서 this로 사용할 값
리턴 값 : 반환 타입은 찾은 요소의 타입 / 없다면 undefined
*/const numberArr = [1, 3, 3, 5, 7];
const objectArr = [
{ name : 'Harry', age ; 20 },
{ name : 'Kim', age ; 23 },
{ name : 'Bae', age ; 26 },
];
console.log(
objectArr.find((item) => {
return item.age === 26; // 해당 조건에 부합하는 값이 있으면 반환
})
);
console.log(numberArr.find((item) => item ===3)); // 3
// 여러개를 배열로 받고 싶으면 find대신 filter 사용4. findIndex()
- 배열 메서드
indexOf()의 콜백함수 버전 - 고차함수
find()의 리턴 값이 인덱스인 버전
arr.findIndex((element, index, array) => {}, thisArg);
/*
element : 현재 배열 요소 값, index : 배열 인덱스
array : 참조한 배열, thisArg : 콜백함수에서 this로 사용할 값
리턴 값 : 요소가 테스트를 통과하면 배열의 인덱스 / 그렇지 않으면 -1
*/const objectArr = [
{ name: 'Kim', age: 30 },
{ name: 'Park', age: 28 },
{ name: 'Bae', age: 13 },
];
console.log(
objectArr.findIndex((item) => {
return item.age === 13; // 해당 조건에 부합하면 item의 인덱스를 반환 => 2를 반환
}),
);5. filter()
filter()메서드는 콜백 함수에 의해 제공된 테스트를 통과한 모든 엘리먼트를 가진 새로운 배열을 만든다.
arr.filter((element, index, array) => {}, thisArg);
/*
element : 현재 배열요소 값, index : 배열 인덱스
array : 참조한 배열, thisArg : 콜백함수에서 this로 사용할 값
리턴 값 : 테스트를 통과한 요소로 이루어진 새로운 배열 / 어떤 요소도 테스트를 통과하지 못했으면 빈 배열을 반환
*/const persons = [
{ name: 'curry', age: 30 },
{ name: 'James', age: 15 },
{ name: 'Thomas', age: 50 },
{ name: 'Jimmy', age: 28 },
];
const fullAge = persons.filter((person) => person.age >= 22);
console.log(fullAge);
/*
[
{ name: 'curry', age: 30 },
{ name: 'Thomas', age: 50 },
{ name: 'Jimmy', age: 28 }
]
*/6. reduce()
- 콜백 함수의 실행된 반환 값(initialValue)을 전달받아 연산의 결과 값이 반환
- 사실상 forEach, map, filter 기능을 reduce로 모두 구현해서 사용할 수 있음
arr.reduce((accumulator, currentValue, index, array) => {
}, initialValue);
/**
* accumulator : 누산기, 순회하면서 계속 더해서 합쳐지는 값
* currentValue : 현재 값
* index : 배열 인덱스
* array : 참조한 배열
* initialValue : 콜백 최초 호출에서 acc 누산기에 제공하는 값, 초기값을 제공하지 않으면 배열의 첫 번째 요소를 사용, 빈 배열에서 초기값 없이 호출하면 에러
* 리턴값 : 누적 계산의 결과값
* /- initialValue 값이 없는 경우
- accumulator : 배열의 첫 번째 값
- currentValue : 배열의 두 번째 값
- initialValue 값이 있는 경우
- accumulator : initialValue가 지정한 값
- currentValue : 배열의 첫 번째 값
const arr = [5, 7, 1, 8, 4];
const sum = arr.reduce(function (accumulator, currentValue) {
return accumulator + currentValue;
}, 10);
console.log(sum); // 35
/*
initialValue가 10으로 잡혀있기 때문에 accumulator는 10, current는 배열 첫 번째 값부터 시작한다.
*/7. sort()
- 배열 정렬
- 단, 복사본이 만들어지는 것이 아닌 원 배열이 정렬된다.
- 콜백 함수를 통해 배열의 원소를 어느 기준으로 정렬할 건지 지정해야함
arr.sort(function (a, b) {}, thisArg);
/*
compareFunction : 정렬 순서를 정의하는 함수. 이 값이 생략되있으면 배열의 element를 문자열로 취급하여 유니코드 값 순서대로 정렬한다.
리턴 값 : sorting된 값
*/8. some()
- 배열 메서드인
include()의 콜백함수 버전 - include는 값이있냐에 따른 boolean이면, some은 함수 로직에 따른 boolean
- 배열의 요소들을 주어진 함수(조건)을 통과하는데 한개라도 통과되면 true, 아니면 false를 출력
- 빈 배열로 함수(조건)을 통과하면 무조건 false를 출력
arr.some((currentValue, index, array) => {}, thisArg);
/**
currentValue : 현재 배열요소값, index : 배열 인덱스
array : 참조한 배열, thisArg : 콜백함수에서 this로 사용할 값
리턴 값 : callback이 어떤 배열 요소라도 대해 참인 값을 반환하는 경우에는 true, 그 외엔 false
**/const array = [1, 3, 5];
const result = array.some((currentValue) => {
return currentValue % 2 === 0;
});
console.log(result); // false
// 하나라도 조건에 부합하면 true가 나온다.9. every()
some()의 반대 버전- 배열안의 모든 요소가 주어진 함수(조건)을 모두 통과하면 true, 한 요소라도 통과하지 못하면 false를 출력
- 빈 배열을 함수에 적용시키면 무조건 true를 반환
arr.every((currentValue, index, array) => {}, thisArg);
/*
currentValue : 현재 배열요소값 , index : 배열 인덱스
array : 참조한 배열 , thisArg : 콜백함수에서 this로 사용할 값
리턴 값 : callback이 모든 배열 요소에 대해 참인 값을 반환하는 경우 true, 그 외엔 false
*/const array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const result = array.every((currentValue) => {
return currentValue < 60;
});
console.log(result); // true
// array 중 하나라도 60보다 큰 값이 나오면 false가 출력된다.👇 도움이 되셨다면 👇